//#include<iostream>
//#include<vector>
//using namespace std;
//
//const int N = 20;
//
//int n;
//vector<int> v;
//bool st[N];
//
//void dfs(int u)
//{
//	if (u == n)
//	{
//		for (int i = 0; i < n; i++)
//			printf("%5d", v[i]);
//		puts("");
//		return;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (!st[i])
//		{
//			st[i] = true;
//			v.push_back(i);
//			dfs(u + 1);
//			st[i] = false;
//			v.pop_back();
//		}
//	}
//}
//
//int main()
//{
//	cin >> n;
//	dfs(0);
//	return 0;
//}
//

//#include<iostream>
//#include<vector>
//#include<iomanip>
//using namespace std;
//const int N = 40;
//vector<int> v;
//bool st[N];
//int n, r;
//
//void dfs(int u,int x)
//{
//	if (u == r)
//	{
//		for (auto e : v) cout << setw(3) << e;
//		puts("");
//		return;
//	}
//	for (int i = 1; i <= n; i++)
//	{
//		if (!st[i]&&i>x)
//		{
//			st[i] = true;
//			v.push_back(i);
//			dfs(u + 1,i);
//			st[i] = false;
//			v.pop_back();
//		}
//	}
//}
//
//int main()
//{
//	cin >> n >> r;
//	dfs(0,0);
//	return 0;
//}

//#include<iostream>
//#include<vector>
//#include<algorithm>
//using namespace std;
//
//int n, k;
//const int N = 30;
//vector<int> v;
//vector<int> x;
//bool st[N];
//int ans;
//
//bool is_prime(int x)
//{
//	for (int i = 2; i <= x / i; i++)
//	{
//		if (x % i == 0) return false;
//	}
//	return true;
//}
//
//void dfs(int u,int w)
//{
//	if (u == k)
//	{
//		int sum = 0;
//		for (int i = 0; i < k; i++) sum += v[i];
//		if (is_prime(sum)) ans++;
//		return;
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (!st[i]&&i>w)
//		{
//			st[i] = true;
//			v.push_back(x[i]);
//			dfs(u + 1,i);
//			st[i] = false;
//			v.pop_back();
//		}
//	}
//}
//
//int main()
//{
//	cin >> n >> k;
//	x.resize(N,0);
//	for (int i = 1; i <= n; i++) cin >> x[i];
//	sort(x.begin()+1, x.begin()+n+1);
//
//	dfs(0,0);
//
//	cout << ans << endl;
//	return 0;
//}

//#include<iostream>
//#include<queue>
//#include<cstring>
//using namespace std;
//
//const int N = 110;
//typedef pair<int, int> pii;
//
//int n, m;
//char g[N][N];
//int d[N][N];
//int st[10], dist[10];
//
//queue<pii> q;
//
//int bfs()
//{
//	memset(d, -1, sizeof d);
//	d[st[0]][st[1]] = 0;
//
//	q.push(make_pair(st[0], st[1]));
//	int dx[4] = { 1,-1,0,0 }, dy[4] = { 0,0,1,-1 };
//
//	while (q.size())
//	{
//		pii t = q.front();
//		q.pop();
//		for (int i = 0; i < 4; i++)
//		{
//			int x = t.first + dx[i], y = t.second + dy[i];
//			if (x >= 0 && y >= 0 && x < n && y < m && d[x][y] == -1 && g[x][y] != '#')
//			{
//				q.push(make_pair(x, y));
//				d[x][y] = d[t.first][t.second] + 1;
//			}
//		}
//	}
//	return d[dist[0]][dist[1]];
//}
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 0; i < n; i++)
//		for (int j = 0; j < m; j++)
//		{
//			cin >> g[i][j];
//			if (g[i][j] == 'S') st[0] = i, st[1] = j;
//			if (g[i][j] == 'T') dist[0] = i, dist[1] = j;
//		}
//	cout << bfs() << endl;
//	return 0;
//}

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;

const int N = 100010;

int n, m;
int d[N];
//bool st[N];
queue<int> q;

int bfs()
{
	memset(d, -1, sizeof d);
	d[n] = 0;

	q.push(n);
	while (q.size())
	{
		int t = q.front();
		q.pop();
		int r = t * 2, b = t - 1;
		if (r > 0 && d[r] == -1)
		{
			q.push(r);
			d[r] = d[t] + 1;
		}
		if (b > 0 && d[b] == -1)
		{
			q.push(b);
			d[b] = d[t] + 1;
		}
		if (d[m] != -1) break;
	}
	return d[m];
}

int main()
{
	cin >> n >> m;
	cout << bfs() << endl;
	return 0;
}